//二叉树

#pragma once

//二叉树的存储结构
template <typename E>
struct BiTNode
{
    E data;
    BiTNode *lchild, *rchild;
};

template <typename E>
using BiTree = BiTNode<E> *;


//先序遍历二叉树 T, 用 visit 访问每个结点
template <typename E, typename F>
void PreOrder(BiTree<E> T, F visit)
{
    if (T)
    {
        visit(T->data);
        PreOrder(T->lchild, visit);
        PreOrder(T->rchild, visit);
    }
}

//中序遍历二叉树 T, 用 visit 访问每个结点
template <typename E, typename F>
void InOrder(BiTree<E> T, F visit)
{
    if (T)
    {
        InOrder(T->lchild, visit);
        visit(T->data);
        InOrder(T->rchild, visit);
    }
}


//后序遍历二叉树 T, 用 visit 访问每个结点
template <typename E, typename F>
void PostOrder(BiTree<E> T, F visit)
{
    if (T)
    {
        PostOrder(T->lchild, visit);
        PostOrder(T->rchild, visit);
        visit(T->data);
    }
}